#!/usr/bin/python
# -*- coding: utf-8 -*-

"""
Author: FQ
Module Description: tb_profile_utils ... 
File: tb_profile_utils.py
Date: 2020/10/16
"""
from pyshare.redis_cache.share.tb_profile_ver_cache import profile_cache_manager
from pyshare.dal.tb_profile_register import TableModelMap


class TbProfileVerManage(object):
    """
    tb配置版本管理对象
    理论上，只会新增表，或增加版本号，不会出现删减的情况
    """
    _table_map = dict()
    _redis_manger = profile_cache_manager
    _ver_dict = _redis_manger.get_all_table_ver()

    @classmethod
    def update_all_from_redis(cls):
        """
        将redis数据更新至内存
        :return:
        """
        cls._ver_dict = cls._redis_manger.get_all_table_ver()
        return cls._ver_dict

    @classmethod
    def update_some_table(cls, new_dict):
        """
        更新redis部分表数据
        :param new_dict:
        :return:
        """
        cls._redis_manger.update_many_table_ver(new_dict)

    @classmethod
    def update_table_by_incr(cls, table_name, incr=1):
        """
        版本号自增
        :param table_name:
        :param incr:
        :return:
        """
        return cls._redis_manger.update_table_by_incr(table_name, incr)

    @classmethod
    def get_table_ver(cls, table_name):
        """
        获取配置表版本号
        不存在的表默认返回0，后台修改默认版本为1
        :param table_name:
        :return:
        """
        return cls._ver_dict.get(table_name, 0)

    @classmethod
    def get_many_table_ver(cls, table_name_list):
        """
        获取多个配置表版本号
        不存在的表默认返回0，后台修改默认版本为1
        :param table_name_list:
        :return:
        """
        table_ver_list = [cls.get_table_ver(table_name) for table_name in table_name_list]

        result = {}
        for table_name, ver in zip(table_name_list, table_ver_list):
            result[table_name] = ver
        return result

    @classmethod
    def get_all_table_ver(cls):
        """
        获取所有表版本号
        :return:
        """
        return cls._ver_dict

    @classmethod
    def update_table_by_incr_if_table_in_ver_map(cls, table_name):
        """
        注册需要版本更新的表
        :param table_name: 表名
        :return:
        """
        if TableModelMap.is_in(table_name):
            cls.update_table_by_incr(table_name)

    @staticmethod
    def change_list_to_dict(res_list):
        table_name = None
        data_dict = dict()
        for i, v in enumerate(res_list):
            if i % 2 == 0:
                table_name = v
            else:
                if table_name:
                    data_dict[table_name] = int(v)
        return data_dict

    @classmethod
    def update_many_table_by_incr(cls, table_list):
        """
        版本号自增
        :param table_list: [table_name...]
        :return: 当前版本数据，失败列表
        """
        # 失败列表
        fail_table = list()
        old_ver, new_ver = cls._redis_manger.update_many_table_by_incr(table_list)
        old_dict = cls.change_list_to_dict(old_ver)
        new_dict = cls.change_list_to_dict(new_ver)
        for table, ver in new_dict.iteritems():
            o_v = old_dict.get(table, 0)
            if ver < o_v + 1 and table in table_list:
                # 新版本号没有增加，且是更新的表，那么则判定该表更新失败
                fail_table.append(table)
        # 后台修改后，立即生效
        cls.update_all_from_redis()
        return new_dict, fail_table
